/*
 * Representa pedidos realizados por clientes y satisfechos por mozos
 */
package grest.model;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Time;
import java.util.Calendar;
import java.sql.Date;
import java.util.List;
/**
 *  Representa pedidos realizados por clientes y satisfechos por mozos
 * @author santiago
 */
public class Pedido implements Entidad {
    private Integer nroMozo,idMovimiento,cantidad;
    private Date fecha;
    private java.sql.Time hora;
    private Productos producto;
    private double precio;
    private Boolean changed;
    private String descrip;
    private Boolean prechanged=false;         
    
    public Pedido(){
        Calendar c = Calendar.getInstance();
        this.nroMozo=1;
        this.idMovimiento=0;
        this.fecha=new Date(c.get(Calendar.YEAR), c.get(Calendar.MONTH), c.get(Calendar.DATE));
        this.hora=new Time(c.get(Calendar.HOUR), c.get(Calendar.MINUTE), c.get(Calendar.SECOND));
        this.producto=new Productos(0, "", 0.0);
        this.cantidad=0;
        this.precio=0.0;
        setChanged(false);
    }
    public Pedido(ResultSet rs)throws SQLException{
       this.nroMozo=rs.getInt("nro_mozo"); 
       this.idMovimiento=rs.getInt("id_movimiento"); 
       this.fecha=rs.getDate("fecha");
       this.hora=java.sql.Time.valueOf(rs.getString("hora"));
       this.producto=new Productos(rs.getInt("id_producto"), rs.getString("descripcion"), 0.0);
       this.cantidad=rs.getInt("cantidad");
       this.precio=rs.getDouble("precio");
       setChanged(false);
    }
    public Pedido(Integer nroMozo, Integer idMov, Date fecha, Time hora, Integer idProd, Integer cant, Double precio){
        this.nroMozo=nroMozo;
        this.idMovimiento=idMov;
        this.fecha=fecha;
        this.hora=hora;
        this.producto=new Productos(idProd, "", 0.0);
        this.cantidad=cant;
        this.precio=precio;
        setChanged(false);
    }
    public Pedido(Integer nroMov){
        this(1,nroMov,
               new Date(Calendar.YEAR, Calendar.MONTH, Calendar.DATE),
               new java.sql.Time(Calendar.HOUR, Calendar.MINUTE, Calendar.SECOND),
               1,
               1,
               1.0);
   }
    //Métodos setters
    /**
     * Establece si la tupla fue modificada o no
     * @param changed 
     */
    @Override
    public void setChanged(boolean changed){
        if(!prechanged)this.changed=changed;
    }
    /**
     * Establece el número de mozo encargado del pedido
     * @param nroMozo 
     */
    public void setNroMozo(Integer nroMozo){
        this.nroMozo=nroMozo;
        setChanged(true);
    }
    /**
     * Establece el movimiento correspondiente al pedido
     * @param nroMov 
     */
    public void setIdMovimiento(Integer nroMov){
        this.idMovimiento=nroMov;
        setChanged(true);
    }
    /**
     * Establece la fecha del pedido
     * @param fecha 
     */
    public void setFecha(Date fecha){
        this.fecha=fecha;
        setChanged(true);
    }
    /**
     * Establece la hora en que fue efectuado el pedido
     * @param hora 
     */
    public void setHora(Time hora){
        this.hora=hora;
        setChanged(true);
    }
    /**
     * Establece el producto asociado al pedido
     * @param idProduc 
     */
    public void setProducto(Integer idProduc){
        this.producto.setIDP(idProduc);
        setChanged(true);
    }
    /**
     * Establece la cantidad de unidades del productos solicitado
     * @param cant 
     */
    public void setCantidad(Integer cant){
        this.cantidad=cant;
        setChanged(true);
    }
    /**
     * Sobreescribe el precio base de el producto asociado a la venta,
     * para esta instancia
     * @param precio 
     */
    public void setPrecio(Double precio){
        this.precio=precio;
        setChanged(true);
    }
    /**
     * Establece la descripción del producto
     * @param descrip 
     */
    public void setDescrPro(String descrip){
        this.producto.setDesc(descrip);
    }
    /**
     * Establece el valor de una columna
     * @param model
     * @param row
     * @param col
     * @param value 
     */
    @Override
    public void setColumnValue(List<Entidad> model,int row,int col,Object value){
        switch(col){
            case 0:
                ((Pedido)model.get(row)).setNroMozo((Integer)value);
                break;
            case 1:
                ((Pedido)model.get(row)).setFecha((Date)value);
                break;
            case 2: 
                ((Pedido)model.get(row)).setHora((java.sql.Time)value);
                break;
            case 3:
                ((Pedido)model.get(row)).setProducto((Integer)value);
                break;
            case 5:
                ((Pedido)model.get(row)).setCantidad((Integer)value);
                break;
            case 6:
                ((Pedido)model.get(row)).setPrecio((Double)value);
                break;
        }
    }
    //Métodos getters
    /**
     * Devuelve el número de mozo asociado al pedido
     * @return 
     */
    public Integer getNroMozo(){
        return nroMozo;
    }
    /**
     * Devuelve el movimiento al cuál se encuentra asocidado el pedido
     * @return 
     */
    public Integer getIdMov(){
        return idMovimiento;
    }
    /**
     * Devuelve la fecha del pedido
     * @return 
     */
    public Date getFecha(){
        return fecha;
    }
    /**
     * Devuevle el horario en el cual fue realizado el pedido
     * @return 
     */
    public String getHora(){
        return hora.toString();
    }
    /**
     * Retorna el id del producto asociado al pedido
     * @return 
     */
    public Integer getIdProducto(){
        return producto.getId();
    }
    /**
     * Devuelve la cantidad solicitada del producto asociado al pedido
     * @return 
     */
    public Integer getCantidad(){
        return cantidad;
    }
    /**
     * Devuelve la descripción del producto asociado al pedido
     * @return 
     */
    public String getDescr(){
        return producto.getDesc();
    }
    /**
     * Devuelve el precio con el cual fue vendido el producto
     * @return 
     */
    public Double getPrecio(){
        return precio;
    }
    /**
     * Determina si la tupla se encuentra modificada y no persistida
     * @return 
     */
    @Override
    public boolean isChanged(){
        return changed;
    }
    /**
     * Determina si una columna de la tabla puede ser modificada
     * @param column
     * @return 
     */
    @Override
    public boolean isColumnEditable(int column){
        return false;
    }
    /**
     * Devuelve la cantidad de columnas de la entidad
     * @return 
     */
    @Override
    public int getColumnCount(){
        return 7;
    }
    /**
     * Retorna la clase de la columna especificada
     * @param colum
     * @return 
     */
    @Override
    public Class getColumnClass(int colum){
        switch(colum){
            case 0:return Integer.class;
            case 1:return Date.class;
            case 2: return String.class;
            case 3: return Integer.class;
            case 4: return String.class;
            case 5: return Integer.class;
            case 6: return Double.class;
        }
        return null;
    }
    @Override
    public void loadTuplas(List<Entidad> model,ResultSet tuplas) throws SQLException{
        model.add(new Pedido(tuplas));
    }
    @Override
    public String getSelectQuery(){
       if (this.idMovimiento != null)
       return "SELECT NRO_MOZO,ID_MOVIMIENTO,FECHA,HORA,ID_PRODUCTO,DESCRIPCION,CANTIDAD,PRECIO FROM T_PEDIDOS P NATURAL JOIN T_PRODUCTOS PR WHERE P.ID_MOVIMIENTO = "+ this.getIdMov();
       else
            return "SELECT NRO_MOZO,FECHA,HORA,ID_PRODUCTO,DESCRIPCION,CANTIDAD,PRECIO FROM T_PEDIDOS P NATURAL JOIN T_PRODUCTOS";
   }
    @Override
    public String getUpdateQuery(){
        return "UPDATE FROM T_PEDIDOS SET ID_PRODUCTO=" + this.producto +
                ", CANTIDAD= " + this.cantidad;
    }
    @Override
    public String getInsertQuery(){
        return "INSERT INTO T_PEDIDOS VALUES("+this.nroMozo+","+
                this.idMovimiento+","+this.fecha+","+this.hora
                +","+this.producto.getId()+","+this.cantidad+","+
                this.precio+")";
    }
    @Override
    public String getDeleteQuery(){
        return "DELETE FROM T_PEDIDOS WHERE NRO_MOZO="+this.nroMozo+" AND ID_MOVIMIENTO="+this.idMovimiento+
                "AND FECHA='"+this.fecha+"' AND HORA='"+this.hora+"' AND ID_PRODUCTO="+this.producto.getId();
    }

    @Override
    public String getColumnTitle(int columna) {
        switch(columna){
            case 0: return "Nro. mozo";
            case 1: return "Fecha";
            case 2: return "Hora";
            case 3: return "ID Producto";
            case 4: return  "Descrip.";
            case 5: return "Cantidad";
            case 6: return "Precio";  
        }
        return null;
    }

    @Override
    public Object getColumnValue(List<Entidad> model, int fila, int columna) {
        switch(columna){
            case 0: return ((Pedido)model.get(fila)).getNroMozo();
            case 1: return ((Pedido)model.get(fila)).getFecha();
            case 2: return ((Pedido)model.get(fila)).getHora();
            case 3: return ((Pedido)model.get(fila)).getIdProducto();
            case 4: return ((Pedido)model.get(fila)).getDescr();
            case 5: return ((Pedido)model.get(fila)).getCantidad();
            case 6: return ((Pedido)model.get(fila)).getPrecio();       
        }
        return null;
    }

    @Override
    public void setPreChanged(boolean mod) {
        this.prechanged=mod;
    }

    @Override
    public boolean isPreChanged() {
        return prechanged;
    }

    @Override
    public String onPreInsertQuery() {
        throw new UnsupportedOperationException("No soportado");
    }

    @Override
    public void setID(Object id) {
        throw new UnsupportedOperationException("No soportado");
    }
    @Override
    public String toString(){
        return this.nroMozo+" "+this.idMovimiento+" "+this.fecha+" "+this.hora+" "+this.producto.getId();
    }
}
